package com.singfan.common.util;

import java.util.ArrayList;
import java.util.List;

/**
 * 字符串相关工具类
 * Author: HanSongHe
 * Date: 2015-07-27 11:51
 * Desc:
 */
public class StringUtil {
    /**
     * 判断字符串的值是否为null或者为空字符串
     *
     * @param value 字符串的值
     * @return true:是  false:不是
     */
    public static boolean isNullOrEmpty(String value){
        return (value == null || value.equals(""));
    }

    /**
     * 判断字符串的值是否全部由空格组成（1-N个空格）
     * @param value 字符串的值
     * @return true:是  false:不是
     */
    public static boolean isBlank(String value) {
        boolean result = false;

        if (!isNullOrEmpty(value)){
            if (isNullOrEmpty(value.trim())){
                result = true;
            }
        }

        return result;
    }

    /**
     * 设置字符串首字母大写，其它字符串不变
     *
     * @param value 字符串值
     * @return 首字母大写的字符串
     */
    public static String setInitialCapital(String value){
        if(!isNullOrEmpty(value)){
            if(value.length() == 1){
                return value.toUpperCase();
            }
            else{
                String initialCapital = value.substring(0,1);
                String otherChar = value.substring(1);

                return initialCapital.toUpperCase() + otherChar;
            }
        }

        return value;
    }

    /**
     * 设置字符串首字母小写，其它字符串不变
     *
     * @param value 字符串值
     * @return 首字母小写的字符串
     */
    public static String setInitialLowercase(String value){
        if(!isNullOrEmpty(value)){
            if(value.length() == 1){
                return value.toLowerCase();
            }
            else{
                String initialCapital = value.substring(0,1);
                String otherChar = value.substring(1);

                return initialCapital.toLowerCase() + otherChar;
            }
        }

        return value;
    }

    /**
     * 去除后缀名
     *
     * @param fullName 带后缀名的名称
     * @return 去除后缀名的命名
     */
    public static String removeExt(String fullName){
        String result;
        if(!isNullOrEmpty(fullName)){
            int extIndex = fullName.lastIndexOf(".");
            if (extIndex >= 0){
                result = fullName.substring(0,extIndex);
            }
            else {
                result = fullName;
            }
        }
        else{
            result = fullName;
        }
        return result;
    }

    /**
     * 将Java里的名字转换成通用的名字（例如：SampleClassName -> sample_class_name）
     * @param javaName Java中的变量名
     * @return 通用的名字
     */
    public static String javaName2CommonName(String javaName){
        String commonName;

        if(!StringUtil.isNullOrEmpty(javaName)){
            javaName = setInitialLowercase(javaName);
            StringBuilder commonNameBuilder = new StringBuilder();
            for (int i=0; i < javaName.length(); i++){
                char c = javaName.charAt(i);
                if(c >= 97 && c <= 122){
                    commonNameBuilder.append(c);
                }
                else if(c >= 65 && c <= 90){
                    commonNameBuilder.append("_");
                    commonNameBuilder.append((char) (c + 32));
                }
                else if(c >= 48 && c <= 57){
                    commonNameBuilder.append("_");
                    commonNameBuilder.append(javaName.substring(i));
                    break;
                }
            }

            commonName = commonNameBuilder.toString();
        }
        else {
            commonName = javaName;
        }

        return commonName;
    }

    /**
     * 将通用的名字转换成Java里的类名字（例如：sample_class_name -> SampleClassName）
     * @param commonName 通用的名字
     * @return Java里的类名字
     */
    public static String commonName2JavaClassName(String commonName){
        String javaClassName;

        if(!StringUtil.isNullOrEmpty(commonName)){
            String[] words = commonName.split("_");
            StringBuilder javaNameBuilder = new StringBuilder();
            for (String word : words){
                javaNameBuilder.append(setInitialCapital(word));
            }

            javaClassName = javaNameBuilder.toString();
        }
        else {
            javaClassName = commonName;
        }

        return javaClassName;
    }

    /**
     * 将通用的名字转换成Java里的字段名字（例如：sample_field_name -> sampleFieldName）
     * @param commonName 通用的名字
     * @return Java里的字段名字
     */
    public static String commonName2JavaFieldName(String commonName){
        String javaFieldName;

        String javaClassName = commonName2JavaClassName(commonName);
        if(!StringUtil.isNullOrEmpty(javaClassName)){
            javaFieldName = setInitialLowercase(javaClassName);
        }
        else {
            javaFieldName = javaClassName;
        }

        return javaFieldName;
    }

    /**
     * 将字节数组转成字符串（null还是null，空数组转成空字符串）
     * @param data 字节数组
     * @return 字符串
     */
    public static String byteArr2String(byte[] data){
        String result = null;
        if(data != null){
            int dataLength = data.length;
            if(dataLength > 0){
                StringBuilder stringBuilder = new StringBuilder(dataLength);
                for (byte b : data){
                    stringBuilder.append((char) b);
                }
                result = stringBuilder.toString();
            }
            else{
                result = "";
            }
        }

        return result;
    }

    /**
     * 用指定的分隔符，将字符串分割为一连串更小的字符串 em: chunkSplit("hello", 2, "-") -> he-ll-o-
     * @param value 字符串
     * @param length 每个小字符的长度
     * @param separator 每个小字符的分隔符
     * @return 一连串更小的字符串
     */
    public static String chunkSplit(String value, int length, String separator){
        if(!isNullOrEmpty(value) && length>0 && separator!= null && separator.length()>0){
            if(value.length()>length){
                int valueLength = value.length();
                StringBuilder stringBuilder = new StringBuilder();
                int beginIndex = 0;
                int endIndex = length;
                while (beginIndex < valueLength){
                    if(endIndex > valueLength){
                        endIndex = valueLength;
                    }
                    stringBuilder.append(value.substring(beginIndex, endIndex));
                    stringBuilder.append(separator);
                    beginIndex += length;
                    endIndex += length;
                }

                return stringBuilder.toString();
            }
            else{
                return value + separator;
            }
        }
        else{
            return value;
        }
    }

    /**
     * 将字符串按照指定的分隔符，拆分成字符串列表
     * @param value 要拆分的字符串
     * @param separator 分隔符
     * @return 字符串列表
     */
    public static List<String> split(String value, String separator){
        List<String> result;
        if (!isNullOrEmpty(value)){
            String[] arr = value.split(separator);
            result = new ArrayList<>(arr.length);
            for (String text : arr){
                if (!StringUtil.isNullOrEmpty(text))
                    result.add(text);
            }
        }
        else {
            result = new ArrayList<>();
        }
        return result;
    }
}
